package in.rob.client.page; import in.lib.Constants; import in.lib.annotation.InjectView; import in.lib.annotation.OnClick; import in.lib.manager.ImageAPIManager; import in.lib.manager.ImageAPIManager.Provider; import in.lib.manager.SettingsManager; import in.lib.manager.UserManager; import in.lib.utils.StringUtils; import in.lib.utils.Views; import in.rob.client.MainApplication; import in.rob.client.R; import in.rob.client.SplashActivity; import in.rob.client.base.RobinFragment; import in.rob.client.dialog.base.DialogBuilder; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.HashMap; import android.app.Activity; import android.app.NotificationManager; import android.app.TimePickerDialog; import android.app.TimePickerDialog.OnTimeSetListener; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnDismissListener; import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.TimePicker; public class GeneralSettingsPage extends RobinFragment implements OnCheckedChangeListener, OnSeekBarChangeListener, OnClickListener { @InjectView(R.id.inline_wifi) public CheckBox mInlineWifi; @InjectView(R.id.shake_refresh) public CheckBox mShakeRefresh; @InjectView(R.id.quick_post_notification) public CheckBox mQuickPost; @InjectView(R.id.refresh_timeout) public SeekBar mRefreshTimeout; @InjectView(R.id.timeout_text) public TextView mRefreshTv; @InjectView(R.id.image_provider) public TextView mImageProvider; @InjectView(R.id.notification_quiet_mode) public CheckBox mQuietMode; @InjectView(R.id.quite_hours_summary) public TextView mQuietSummary; @InjectView(R.id.quiet_mode_summary) public TextView mQuietModeSummary; @InjectView(R.id.request_timeout) public SeekBar mRequestTimeout; @InjectView(R.id.request_text) public TextView mRequestTv; @OnClick @InjectView(R.id.quiet_hours) public View mQuietHours; @OnClick @InjectView(R.id.image_provider_container) public View mImageProvView; @OnClick @InjectView(R.id.logout_button) public View mLogout; private SettingsManager mSettingsManager; private Intent mIntent; private NotificationManager notificationManager; public static final int QUICK_POST_ID = 0x5135; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.general_settings_view, null); Views.inject(this, view); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); notificationManager = (NotificationManager)getContext().getSystemService(Context.NOTIFICATION_SERVICE); mSettingsManager = SettingsManager.getInstance(); mIntent = new Intent(); // init inputs mRefreshTimeout.setOnSeekBarChangeListener(this); mRefreshTimeout.setProgress(SettingsManager.getCacheTimeout() < 0 ? 0 : (int)(SettingsManager.getCacheTimeout() / 1000 / 60)); mRefreshTv.setText(SettingsManager.getCacheTimeout() < 0 ? getString(R.string.never) : (int)(SettingsManager.getCacheTimeout() / 1000 / 60) + " mins"); mQuickPost.setChecked(SettingsManager.isQuickPostEnabled()); mQuickPost.setOnCheckedChangeListener(this); mShakeRefresh.setChecked(SettingsManager.isShakeRefreshEnabled()); mShakeRefresh.setOnCheckedChangeListener(this); mImageProvider.setText(SettingsManager.getImageProvider().getName()); mQuietMode.setOnCheckedChangeListener(this); mQuietMode.setChecked(SettingsManager.isQuietModeEnabled()); mInlineWifi.setOnCheckedChangeListener(this); mInlineWifi.setChecked(SettingsManager.isInlineImageWifiEnabled()); mRequestTimeout.setOnSeekBarChangeListener(this); mRequestTimeout.setProgress(SettingsManager.getRequestTimeout() <= 0 ? 0 : (int)(SettingsManager.getRequestTimeout() / 1000)); mRequestTv.setText(SettingsManager.getRequestTimeout() <= 0 ? getString(R.string.never) : (int)(SettingsManager.getRequestTimeout() / 1000) + " seconds"); setQuietStrings(); } public void setQuietStrings() { GregorianCalendar dateAfter = new GregorianCalendar(); dateAfter.setTimeInMillis(SettingsManager.getQuietModeFrom()); GregorianCalendar dateBefore = new GregorianCalendar(); dateBefore.setTimeInMillis(SettingsManager.getQuietModeTo()); String fromHour = "" + dateAfter.get(Calendar.HOUR_OF_DAY) + ":"; String fromMinute = StringUtils.padTo("" + (dateAfter.get(Calendar.MINUTE)), 2, "0", true); String fromAmPm = "";//dateAfter.get(Calendar.AM_PM) == Calendar.AM ? "am" : "pm"; String toHour = "" + dateBefore.get(Calendar.HOUR_OF_DAY) + ":"; String toMinute = StringUtils.padTo("" + (dateBefore.get(Calendar.MINUTE)), 2, "0", true); String toAmPm = "";//dateBefore.get(Calendar.AM_PM) == Calendar.AM ? "am" : "pm"; mQuietSummary.setText(getString(R.string.quiet_summary) + " " + fromHour + fromMinute + fromAmPm + "-" + toHour + toMinute + toAmPm); mQuietModeSummary.setText(getString(R.string.quiet_mode_summary) + " " + fromHour + fromMinute + fromAmPm + "-" + toHour + toMinute + toAmPm); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView == mQuietMode) { mSettingsManager.setQuietModeEnabled(isChecked); } else if (buttonView == mInlineWifi) { mSettingsManager.setInlineImageWifiOnly(isChecked); } else if (buttonView == mQuickPost) { mSettingsManager.setQuickPostEnabled(isChecked); if (isChecked) { ((MainApplication)getActivity().getApplication()).initQuickPost(); } else { notificationManager.cancel(QUICK_POST_ID); } } else if (buttonView == mShakeRefresh) { mSettingsManager.setShakeRefreshEnabled(isChecked); } if (mIntent.getExtras() != null) { getActivity().setResult(Constants.RESULT_REFRESH, mIntent); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == Constants.REQUEST_RINGTONE) { if (resultCode == Activity.RESULT_OK) { Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); if (uri != null) { mSettingsManager.setNotificationTone(uri.toString()); } } } } @Override public void onClick(View v) { if (v == mQuietHours) { final GregorianCalendar dateAfter = new GregorianCalendar(); dateAfter.setTimeInMillis(SettingsManager.getQuietModeFrom()); final GregorianCalendar dateBefore = new GregorianCalendar(); dateBefore.setTimeInMillis(SettingsManager.getQuietModeTo()); final TimePickerDialog fromTime = new TimePickerDialog(getContext(), new OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { dateAfter.set(Calendar.DAY_OF_MONTH, 1); dateAfter.set(Calendar.HOUR_OF_DAY, hourOfDay); dateAfter.set(Calendar.MINUTE, minute); } }, dateAfter.get(Calendar.HOUR_OF_DAY), dateAfter.get(Calendar.MINUTE), true); final TimePickerDialog toTime = new TimePickerDialog(getContext(), new OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { dateBefore.set(Calendar.DAY_OF_MONTH, 1); if (hourOfDay < dateAfter.get(Calendar.HOUR_OF_DAY)) { dateBefore.add(Calendar.DAY_OF_MONTH, 1); } dateBefore.set(Calendar.HOUR_OF_DAY, hourOfDay); dateBefore.set(Calendar.MINUTE, minute); mSettingsManager.setQuietHours(dateAfter.getTimeInMillis(), dateBefore.getTimeInMillis()); setQuietStrings(); } }, dateBefore.get(Calendar.HOUR_OF_DAY), dateBefore.get(Calendar.MINUTE), true); fromTime.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { toTime.show(); } }); toTime.setTitle(R.string.set_to_time); fromTime.setTitle(R.string.set_from_time); fromTime.show(); } else if (v == mImageProvView) { final HashMap<String, ImageAPIManager.Provider> providers = new HashMap<String, ImageAPIManager.Provider>(); for (Provider p : ImageAPIManager.Provider.values()) { providers.put(p.getName(), p); } DialogBuilder.create(getContext()) .setTitle(R.string.pick_option) .setItems(providers.keySet().toArray(new String[providers.size()]), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String[] prov = providers.keySet().toArray(new String[providers.size()]); mSettingsManager.setImageProvider(providers.get(prov[which])); ImageAPIManager.getInstance().registerForToken(getContext(), UserManager.getUser()); mImageProvider.setText(prov[which]); } }) .show(); } else if (v == mLogout) { DialogBuilder.create(getContext()) .setTitle(R.string.confirm) .setMessage(R.string.logout_description) .setPositiveButton(R.string.logout, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // clear user UserManager.logout(getContext()); // restart app Intent auth = new Intent(getContext(), SplashActivity.class); auth.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); auth.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); auth.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); auth.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(auth); } }) .setNegativeButton(R.string.cancel, null) .show(); } } /** * Popup for animation settings */ @OnClick(R.id.stream_markers) public void showStreamMarkerOptions() { final boolean[] options = new boolean[getResources().getStringArray(R.array.stream_marker_options).length]; final int[] ints = getResources().getIntArray(R.array.stream_marker_choice_mask); for (int index = 0; index < ints.length; index++) { options[index] = (SettingsManager.getStreamMarker() & ints[index]) == ints[index]; } DialogBuilder.create(getContext()) .setTitle(R.string.pick_option) .setMultiChoiceItems(R.array.stream_marker_options, options, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { options[which] = isChecked; } }) .setPositiveButton(R.string.done, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int finalInt = 0; for (int index = 0; index < options.length; index++) { if (options[index]) { finalInt |= ints[index]; } } mSettingsManager.setStreamMarkerOptions(finalInt); } }) .setNegativeButton(R.string.cancel, null) .show(); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (seekBar == mRefreshTimeout) { if (progress == 0) { mRefreshTv.setText(R.string.never); mSettingsManager.setCacheTimeout(-1); } else { mRefreshTv.setText(progress + " mins"); mSettingsManager.setCacheTimeout(progress * 60 * 1000); } } else if (seekBar == mRequestTimeout) { if (progress == 0) { mRequestTv.setText(R.string.never); mSettingsManager.setRequestTimeout(-1); } else { mRequestTv.setText(progress + " seconds"); mSettingsManager.setRequestTimeout(progress * 1000); } } } @Override public void onStartTrackingTouch(SeekBar seekBar){} @Override public void onStopTrackingTouch(SeekBar seekBar){} }